package controller

import (
	"github.com/gin-gonic/gin"
	"k8s-dash/dto"
	"k8s-dash/middleware"
	"k8s-dash/service"
	"k8s-dash/utils"
	"k8s-dash/utils/logger"
)

type nsController struct{}

var NSController nsController

func (p *nsController) Register(ginRouter *gin.RouterGroup) {
	nd := &nsController{}
	ginRouter.GET("/k8s/namespace/list", nd.GetNSList)
	ginRouter.GET("/k8s/namespace/detail", nd.GetNSDetail)
	ginRouter.POST("/k8s/namespace/create", nd.CreateNS)
	ginRouter.DELETE("/k8s/namespace/del", nd.DeleteNS)

}

// GetNSList namespace，支持分页过滤排序
// ListPage godoc
// @Summary      namespace
// @Description  namespace
// @Tags         namespace
// @ID           /api/k8s/namespace/list
// @Accept       json
// @Produce      json
// @Param        filter_name  query  string  false  "过滤"
// @Param        page         query  int     false  "页码"
// @Param        limit        query  int     false  "分页限制"
// @Success      200 {object}  middleware.Response"{"code": 200, msg="","data": service.NamespaceResp}"
// @Router       /api/k8s/namespace/list [get]
func (n *nsController) GetNSList(ctx *gin.Context) {
	parmas := &dto.NSListInput{}
	//参数验证
	err := parmas.BindValidate(ctx)
	if err != nil {
		logger.LG.Error(utils.GetErrorMsg(utils.ParamBindError))
		middleware.ResponseError(ctx, utils.NewGlobalError(utils.ParamBindError, err))
		return
	}
	nsList, err := service.Namespace.GetNSList(parmas.FilterName, parmas.Limit, parmas.Page)
	if err != nil {
		logger.LG.Error(utils.GetErrorMsg(utils.GetError))
		middleware.ResponseError(ctx, utils.NewGlobalError(utils.GetError, err))
		return
	}
	middleware.ResponseSuccess(ctx, nsList)
}

// GetNSDetail namespace
// ListPage godoc
// @Summary      namespace
// @Description  namespace
// @Tags         namespace
// @ID           /api/k8s/namespace/detail
// @Accept       json
// @Produce      json
// @Param        name  query  string  true  "name"
// @Success      200 {object}  middleware.Response"{"code": 200, msg="","data": coreV1.namespace}"
// @Router       /api/k8s/namespace/detail [get]
func (n *nsController) GetNSDetail(ctx *gin.Context) {
	parmas := &dto.NSNameInput{}
	if err := parmas.BindValidate(ctx); err != nil {
		logger.LG.Error(utils.GetErrorMsg(utils.ParamBindError))
		middleware.ResponseError(ctx, utils.NewGlobalError(utils.ParamBindError, err))
	}
	nsDetail, err := service.Namespace.GetNSDetail(parmas.Name)
	if err != nil {
		logger.LG.Error(utils.GetErrorMsg(utils.GetError))
		middleware.ResponseError(ctx, utils.NewGlobalError(utils.GetError, err))
		return
	}
	middleware.ResponseSuccess(ctx, nsDetail)
}

// CreateNS 创建namespace
// ListPage godoc
// @Summary      创建namespace
// @Description  创建namespace
// @Tags         namespace
// @ID           /api/namespace/create
// @Accept       json
// @Produce      json
// @Param        body  body dto.NSNameInput  true  "body"
// @Success      200 {object}  middleware.Response"{"code": 200, msg="","data": ""}"
// @Router       /api/k8s/namespace/create [post]
func (d *nsController) CreateNS(ctx *gin.Context) {
	params := &dto.NSNameInput{}
	if err := params.BindValidate(ctx); err != nil {
		logger.LG.Error(utils.GetErrorMsg(utils.ParamBindError))
		middleware.ResponseError(ctx, utils.NewGlobalError(utils.ParamBindError, err))
	}
	err := service.Namespace.CreateNS(params.Name)
	if err != nil {
		logger.LG.Error(utils.GetErrorMsg(utils.CreateError))
		middleware.ResponseError(ctx, utils.NewGlobalError(utils.CreateError, err))
	}
	middleware.ResponseSuccess(ctx, "创建成功")
}

// DeleteNS 删除namespace
// ListPage godoc
// @Summary      删除namespace
// @Description  删除namespace
// @Tags         namespace
// @ID           /api/k8s/namespace/delete
// @Accept       json
// @Produce      json
// @Param        name    query  string  true  "命名空间"
// @Success      200 {object}  middleware.Response"{"code": 200, msg="","data": nil}"
// @Router       /api/k8s/namespace/delete [delete]
func (d *nsController) DeleteNS(ctx *gin.Context) {
	parmas := &dto.NSNameInput{}
	if err := parmas.BindValidate(ctx); err != nil {
		logger.LG.Error(utils.GetErrorMsg(utils.ParamBindError))
		middleware.ResponseError(ctx, utils.NewGlobalError(utils.ParamBindError, err))
	}
	err := service.Namespace.DeleteNS(parmas.Name)
	if err != nil {
		logger.LG.Error(utils.GetErrorMsg(utils.DeleteError))
		middleware.ResponseError(ctx, utils.NewGlobalError(utils.DeleteError, err))
		return
	}
	middleware.ResponseSuccess(ctx, nil)
}
